1. Select an appropriate DV (dependent variable) and justify your choice. There are many possible dependent variables in this dataset; you do not need several. Find one, but explain your choice.
2. Before you begin any analysis, write a theoretical justification of the influence that networks may have on your selected DV. Choose one or more networks that could have an impact on your DV, and explain their hypothesized influence. Is it social selection or social influence? What is the theoretical foundation for your model? Also select several non-network independent variables that you can use in your model.
3. Create and examine (a) network(s) you have identified in the assignment above. Graph the network, including any node attributes you find interesting or important. Make sure your graph is appropriately complex, with a variety of colors and other graph attributes that make it as informative as possible. Examine network indices, paying special attention to whether any of them appear to be of special interest. See if you can identify individual nodes that appear to be the most influential; explain their influence.
4. Perform one of the community detection examination (blockmodel being the most straightforward, but you can also try some clustering methods). What do you observe? Explain your result.
5. Create a model of social influence - that is, a model of network variable influence on the DV of interest. Here, you will need to run either a factor-analytic or a regression model; follow all the appropriate assumption testing procedures and eliminate non-significant variables. Explain your result.
6. Make a global conclusion - what have you learned about your data by combining network and non-network analysis methods?
Традиционно начинаю работу с вызова необходимых библиотек:
library(knitr)
library(kableExtra)
library(sna)
library(network)
library(igraph)
library(RColorBrewer)
В финальном проекте я буду исследовать намерение работников покинуть организацию (intent to leave), которое можно представлять как индикатор или предиктор текучести кадров – одной из важнейших практических проблем управления человеческими ресурсами. Здесь я построю линейную модель, в которой зависимой переменной будет намерение уйти (intent to leave), а независимыми переменными - параметры удовлетворенности работой, организационной среды и отношений между работниками.
Исследовательский вопрос: какими факторами может объясняться высокая текучесть кадров в организации?
Высокая текучесть кадров непосредственно связана с намерением работников покинуть рабочее место (intent to leave). Попытка найти комплекс факторов, имеющих объяснительный потенциал в отношении намерения покинуть организацию, может стать основанием для управленчеких решений, направленных на сохранение работников (поскольку оргнизация получает выгоду от того, чтобы оставлять при себе ценных и тренированных работников, не тратя ресурсы на постоянное обучение или найм новых) путем влияния, например, на особенности организационной и рабочей среды, которые поддаются управлению. Кроме того, некоторые возможные факторы (например, удовлетворенность работой) в случае значимого влиния на желание покинуть организацию могут стать основанием дальнейших исследований (в качественной парадигме, например) причин недовольства условиями работы. Наконец, включение в модель сетевых переменных (отношения между работниками - дружественные, профессиональные) может способствовать дальнейшим решениям в области управления персоналом и попыткам повысить качество “социальной среды” в организации.
Намерение покинуть организацию широко предствлено в исследованиях в связи с удовлетворенностью работой, которая выступает в качестве предиктора в используемых моделях (Hellman, 1997; Chung & Choo, 2019; Nowrouzi-Kia & Fox, 2020) или “самостоятельно” представленной переменной (Emory et al., 2022). Кроме того, текучесть кадров в той или иной сфере связывается с близким концептом – приверженностью организации (organizational commitment), показывающей уровень участия и вовлеченности в работу, связанных как с удовлетворенностью работой, так и, собственно, намерением уйти (Nowrouzi-Kia & Fox, 2020; Emory et al., 2022).
В датасете OCB удовлетворенность работой и приверженность организации не представлены в качестве отдельных переменных-факторов, однако эти концепты могут быть связаны с переменными физического и эмоционального участия. Физическое участие близко по смыслу приверженности работе, так как включает в себя вопросы “На работе, я отдаю всего себя”, “Я стремлюсь к тому, чтобы закончить всю работу до конца” и пр. Эмоциональное же участие предсталено двояко: с одной стороны, на мой взгляд, эта переменная включает в себя как индикаторы приверженности работе (например “К работе я отношусь с энтузиазмом”), так и индикаторы удовлетворенности работой (“Я доволен своей работой”). Поскольку удовлетворенность работой и приверженность работе высоко скоррелированы как по смыслу, так и на практике (Emory et al., 2022), я включу в модель переменные физического и эмоциального участия в качестве предикторов и буду связывать их одновременно с приверженностью и удовлетворенностью.
В одном из исследований, посвященных желанию уйти из организации, показан негативный эффект вовлеченности в работу и осмысленности работы в желание уйти – в данном случае они выступают как медиаторы “создания работы” (job crafting), то есть индивидуального процесса проектирования работы (Oprea et al., 2020). Участие в работе уже было обсуждено выше; имеет смысл обратить внимание на “осмысленность работы”. Здесь я хочу обратить внимание на два фактора, включенных в датасет: конфликт ролей (противоположные требования от разных руководителей – на мой взгляд, эта переменная в том числе показывает, насколько консистентна работа, насколько она осмысленна с точки зрения “сбивания с толку” противоречивыми требованиями), а также административные проблемы (заполнение ненужных бумаг может вытеснять творческие и интересные задачи, из-за чего для работника может теряться ценность и осмысленность работы – см., например, Гребер, 2020). Стоит отметить, что, поскольку я планирую построить простую модель, эти две переменные я включу туда наравне с остальными независимыми предикторами, без “медиаторского” смысла.
Намерение уйти в эмпиричеких работах связывается также с выгоранием и факторами стресса, способными привести к нему (Estryn-Béhar et al., 2007; Martin et al., 2012). В качестве таких факторов я возьму переменные сложности работы, ответственности работы, скорости работы и объема работы. Стоит отметить, что факторы стресса могут быть представлены не только в связи с выгоранием и повышенным намерением уйти, но, наоборот, повышать желание развиваться на рабочем месте. Эффект факторов стресса будет проверен в линейной модели.
Наконец, в качестве предикторов для модели я буду использовать сетевые переменные, поскольку социальные отношения в организации также могут способствовать желанию уйти или остаться на работе. Я буду использовать сети дружественных и профессиональных отношений и рассчитанные для нмх центральности degree, betweenness и eigenvector. Также я буду использовать Support Network, поскольку поддержка и восприятие поддержки также могут быть связаны с намерением покинуть организацию (Cho et al., 2009; Singh et al., 2014). Для данных этой сети будут рассчитаны аналогичные центральности. Таким образом, в рамках работы будет построена модель социального влияния, показывающая, как сетевые структуры (дружественные, профессиональные и другие связи) воздействуют на атрибуты акторов (в частности, желание покинуть организацию).
Кроме того, я включу в модель переменные возраста и гендера, которые также могут оказывать влияние на изменение независимой переменной.
Таким образом, в общем виде гипотезы работы (для модели социального влияния, которая будет реализована в последней части проекта) следующие:
Удовлетворенность работой и приверженность организации будут снижать намерение покинуть организацию.
Более высокое восприятие осмысленности работы будет снижать намерение покинуть организацию.
Факторы стресса скорее будут повышать намерение покинуть организацию.
Положение работника в сетевых отношениях будет связано с намерением уйти.
Гендер и возраст не будут связаны с намерением уйти.
Создам переменные для модели социального влияния и анализа сетей: во-первых, независимую переменную intent_to_leave, во-вторых, независимые несетевые переменные.
ocb_att<-read.csv('OCB_att.csv', header=TRUE)
# Зависимая переменная -- намерение покинуть компанию
intent_to_leave <- ocb_att$Intent_toLeave
# Возраст и гендер
sex <- ocb_att$Sex
age <- ocb_att$Age
# Удовлетворенность работой и вовлеченность
emot_part <- ocb_att$Emot_Part
phys_part <- ocb_att$Phys_Part
# Осмысленность работы
role_confl <- ocb_att$Role_Conflict
admin_probl <- ocb_att$Admin_problems
# Challenge stressors // burnout indicators
work_quant<-ocb_att$Work_quant
work_resp<-ocb_att$Work_Resp
work_diff<-ocb_att$Work_Diff
work_speed<-ocb_att$Work_Speed
В этой части работы я посмотрю на сети, которые выбрала для модели социального влияния - friendship, prefessional и support networks. В частности, я посмотрю на типы диад и триад, которые в них встречаются, посчитаю для них значение транзитивности, подготовлю центральности для будущей модели, а также визуализирую сети с учетом различных их характеристик и атрибутов вершин.
Для работы с сетями я использую датасет OCD, из которого отдельно создала новые, содержащие в себе информацию по сетям (они есть в папке с данным файлом). Сетевые данные я буду использовать в дихотомизированном виде (связь либо есть, либо нет), кроме того, я создам сразу сети в виде объектов типа igraph и объектов типа network, так как буду пользоваться функционалом обеих соот-щих библиотек.
Note: здесь и далее по рекомендации из файла с final assignment я стараюсь как можно более подробно комментировать свои действия внутри чанков (#)
# Чтение данных
friend <- read.csv('Friendnet.csv', header=TRUE, sep=';', row.names=1)
prof <- read.csv('Profnet.csv', header=TRUE, sep=';', row.names=1)
support <- read.csv('SupportNet.csv', header=TRUE, sep=';', row.names=1)
# Дихотомизация данных -- есть связь / нет связи
friend.any<- ifelse((as.matrix(friend) > 0 & is.na(as.matrix(friend))!= TRUE), 1, 0)
prof.any <- ifelse((as.matrix(prof) > 0 & is.na(as.matrix(prof)) != TRUE), 1, 0)
support.any <- ifelse((as.matrix(support) > 0 & is.na(as.matrix(support)) != TRUE), 1, 0)
# Преобразование в объекты igraph -- для визуализаций и центральностей
friendgraph <-graph.adjacency(friend.any,mode=c("directed"),weighted=NULL,diag=FALSE)
profgraph <-graph.adjacency(prof.any,mode=c("directed"),weighted=NULL,diag=FALSE)
supportgraph <-graph.adjacency(support.any,mode=c("directed"),weighted=NULL,diag=FALSE)
# Преобрразование в объекты network -- для блокмоделирования и др.
friendnet <- as.network(friend.any, directed=TRUE)
profnet <- as.network(prof.any, directed=TRUE)
supportnet <- as.network(support.any, directed=TRUE)
Итак, у меня есть переменные типов network и igraph, содержащие в себе информацию о трех сетях. Визуализирую их (через igraph – далее иллюстрации будут сделаны именно на основе графовых переменных) в самом базовом виде, чтобы в целом оценить структуру данных.
# Фиксирую цветовую гамму для всей дальнейшей работы
my_palette <- brewer.pal(12, 'Set3')
# Визуализация
par(mar=c(1,1,1,1))
plot(friendgraph,
main='Friendship network',
vertex.color = my_palette[1],
vertex.frame.color = 'azure4',
vertex.size=5,
#vertex.size=5,
vertex.label.cex=0.5,
#vertex.label = NA,
edge.width=0.1,
edge.arrow.size=0.3,
edge.arrow.width=0.9,
edge.color = 'azure4',
layout=layout_nicely(friendgraph)
)
plot(profgraph,
main='Professional network',
vertex.color = my_palette[2],
vertex.frame.color = 'azure4',
vertex.size=5,
#vertex.size=5,
vertex.label.cex=0.5,
#vertex.label = NA,
edge.width=0.1,
edge.arrow.size=0.3,
edge.arrow.width=0.9,
edge.color = 'azure4',
layout=layout_nicely(profgraph)
)
plot(supportgraph,
main='Support network',
vertex.color = my_palette[3],
vertex.frame.color = 'azure4',
vertex.size=5,
#vertex.size=5,
vertex.label.cex=0.5,
#vertex.label = NA,
edge.width=0.1,
edge.arrow.size=0.3,
edge.arrow.width=0.9,
edge.color = 'azure4',
layout=layout_nicely(supportgraph)
)
В целом, как можно увидеть из визуализаций, сети довольно похожи друг на друга по структуре: во всех мы видим три большие подгруппы с визуально похожей структурой (и похожими участниками), а также некоторое количество изолированных узлов. Все сети, таким образом, не являются connected: не каждые два узла в них связаны путем.
Посмотрим подробнее на структуру сетей. Сделаю это через подсчет разных типов диад и триад в них.
detach(package:igraph) # Конфликтует здесь с библиотекой network
# Типы диад
dyad.census(friendnet)
## Mut Asym Null
## [1,] 58 227 7096
dyad.census(profnet)
## Mut Asym Null
## [1,] 79 257 7045
dyad.census(supportnet)
## Mut Asym Null
## [1,] 51 199 7131
Наиболее часто встречающийся тип диад (помимо нулевых) во всех сетях – диады ассиметричные, в которых есть только одна направленная связь; в принципе, это было видно еще на графиках выше. Диад с взаимными связями гораздо меньше во всех сетях, при этом взаимные связи характерны более для сети профессиональных отношений. Это довольно ожидаемо, так как данные собраны по организации, и профессиональные связи являются априорными для всех акторов в сети.
# Типы триад
triad.census(friendnet)
## 003 012 102 021D 021U 021C 111D 111U 030T 030C 201 120D 120U 120C
## [1,] 262776 24714 6278 341 189 266 153 224 95 6 35 23 74 14
## 210 300
## [1,] 32 20
triad.census(profnet)
## 003 012 102 021D 021U 021C 111D 111U 030T 030C 201 120D 120U 120C
## [1,] 257189 27644 8523 443 243 323 180 254 125 4 56 29 93 23
## 210 300
## [1,] 67 44
triad.census(supportnet)
## 003 012 102 021D 021U 021C 111D 111U 030T 030C 201 120D 120U 120C
## [1,] 266661 21794 5567 276 185 202 120 201 84 2 31 17 41 19
## 210 300
## [1,] 27 13
Помимо нулевых триад, чаще всего встречаются триады типа 012 – с одной направленной связью. Также во всех сетях часто встречаются триады типа 102 – одна взаимная связь между двумя узлами из трех. Из первого вряд ли можно сделать какой-то ценный вывод, так как это, как я понимаю, статистически самый часто встречающийся в реальных ситуациях тип триад (см. график распределений триад по исследованию птичек в Лекции 2-3), а вот второй не является одним из самых распространенных – то есть в данном поле социальные отношения довольно реципрокные. Это в принципе иллюстрируется и довольно высоким количеством в сетях триад типа 300 – три взаимных связи. Помимо реципрокности можно еще сделать вывод о существовании довольно плотных групп внутри сетей.
# Транзитивность
gtrans(friendnet, measure = 'weak')
## [1] 0.3961832
gtrans(profnet, measure = 'weak')
## [1] 0.462993
gtrans(supportnet, measure = 'weak')
## [1] 0.3655706
Т для сети дружеских отношений равно 0.39. Это значит, что два работника, разделяющие общий контакт (может хар-ться и направленной, и ненаправленной связью: дружат с одним человеком, считают другом / считаются друзьями), с вероятностью 0.39 имеют контакт также и друг с другом. Такое значение тразитивности в целом довольно высоко и соотносится с немалым количеством транзитивных триад. Однако такое значение уровня транзитивности не уберегает сеть от возникновения большого количества структурных дыр, которые, согласно теории Берта, способствуют получению новой информации определенными акторами в сети.
Для профессиональной сети транзитивность уже выше – опять же, в этой сети и больше транзитивных триад, чем в двух других. Ситуация для сети поддержки в целом близка к сети дружбы.
library(igraph)
Centralities – одна из ключевых характеристик узлов в сети с точки зрения их отношения к другим узлам. Именно эти показатели будут дальше использованы в модели социального влияния.
Я буду включать в модель “классические” центральности degree (число связей узла), betweenness (мера центральности, показывающая расположение на геодезиках и соединение узлом других узлов в сети) и eigenvector (степень влияния на сеть, связь с другими влиятельными узлами), рассчитанные для сотрудников в трех сетях – дружеской, профессиональной и сети поддержки. Рассчитаю соответствующие параметры:
indegree_friend <- degree(friendgraph, mode='in') # Число входящих связей узлов
outdegree_friend <- degree(friendgraph, mode='out') # Число исходящих связей узлов
total_degree_friend <- degree(friendgraph, mode='total') # Входящие + исходящие связи
indegree_support <- degree(supportgraph, mode='in')
outdegree_support <- degree(supportgraph, mode='out')
total_degree_support <- degree(supportgraph, mode='total')
indegree_prof <- degree(profgraph, mode='in')
outdegree_prof <- degree(profgraph, mode='out')
total_degree_prof <- degree(profgraph, mode='total')
betweenness_prof <- betweenness(profgraph)
eigenvector_prof <- evcent(profgraph)$vector
betweenness_support <- betweenness(supportgraph)
eigenvector_support <- evcent(supportgraph)$vector
betweenness_friend <- betweenness(friendgraph)
eigenvector_friend <- evcent(friendgraph)$vector
Центральности рассчитываются для каждого узла, а узлов в сети очень много, поэтому представленные в табличном виде центральности будет сложно оценить с точки зрения разброса значений по сети. Построим гистограммы, чтобы оценить, насколько различны узлы по разным показателям центральности:
par(mar=c(2,2,2,2),mfrow=c(5,3))
hist(indegree_friend)
hist(indegree_prof)
hist(indegree_support)
hist(outdegree_friend)
hist(outdegree_prof)
hist(outdegree_support)
hist(total_degree_friend)
hist(total_degree_prof)
hist(total_degree_support)
hist(betweenness_friend)
hist(betweenness_prof)
hist(betweenness_support)
hist(eigenvector_friend)
hist(eigenvector_prof)
hist(eigenvector_support)
Из представленных выше гистограмм видно, что например, по центральности eigenvector узлы принимают в большинстве своем нулевое значения, другие значения представлены очень мало, вариации большой тоже нет (эта центарльность рассчитывается относительно, от 0 до 1). С betweenness ситуация по представленности значений аналогичная, однако сам размах вариации очень высок: значит, можно однозначно определить узлы, которые соединяют разные подграфы наших сетей. Для количества связей все довольно очевидно: много узлов с маленьким их количеством, мало - с большим, плотность распределения в целом убывает довольно равномерно и естественно. Есть популярные узлы, есть не очень.
В целом распределения значений позволяют нам визуализировать сети с их учетом, что я и сделаю в следующей части работы.
Сначала посмотрим, как выглядят сети, если узлы с высоким показателем eigenvector сделать побольше – для того, чтобы посмотреть, где в сетях расположены самые влиятельные узлы.
par(mar=c(1,1,1,1), mfrow=c(1,3))
plot(friendgraph,
main='Friendship network eigenvector',
vertex.color = my_palette[1],
vertex.frame.color = 'azure4',
vertex.size= 1+ eigenvector_friend * 5,
#vertex.size=5,
vertex.label.cex=0.5,
vertex.label = NA,
edge.width=0.1,
edge.arrow.size=0.1,
edge.arrow.width=0.3,
edge.color = 'azure4',
layout=layout_nicely(friendgraph)
)
plot(profgraph,
main='Professional network eigenvector',
vertex.color = my_palette[3],
vertex.frame.color = 'azure4',
vertex.size= 1+ eigenvector_prof * 5,
#vertex.size=5,
vertex.label.cex=0.5,
vertex.label = NA,
edge.width=0.1,
edge.arrow.size=0.1,
edge.arrow.width=0.3,
edge.color = 'azure4',
layout=layout_nicely(profgraph)
)
plot(supportgraph,
main='Support network eigenvector',
vertex.color = my_palette[3],
vertex.frame.color = 'azure4',
vertex.size= 1+ eigenvector_support * 5,
#vertex.size=5,
vertex.label.cex=0.5,
vertex.label = NA,
edge.width=0.1,
edge.arrow.size=0.1,
edge.arrow.width=0.3,
edge.color = 'azure4',
layout=layout_nicely(supportgraph)
)
Видим, что самые влиятельные узлы скорее встречаются в одной из подгрупп сети, и влияние работников в целом практически одинаково для разных типов отношений.
par(mar=c(1,1,1,1), mfrow=c(1,3))
plot(friendgraph,
main='Friendship network betweenness',
vertex.color = my_palette[1],
vertex.frame.color = 'azure4',
vertex.size= 1 + betweenness_friend * 0.02,
#vertex.size=5,
vertex.label.cex=0.5,
vertex.label = NA,
edge.width=0.1,
edge.arrow.size=0.1,
edge.arrow.width=0.3,
edge.color = 'azure4',
layout=layout_nicely(friendgraph)
)
plot(profgraph,
main='Professional network betweenness',
vertex.color = my_palette[3],
vertex.frame.color = 'azure4',
vertex.size= 1+ betweenness_prof * 0.02,
#vertex.size=5,
vertex.label.cex=0.5,
vertex.label = NA,
edge.width=0.1,
edge.arrow.size=0.1,
edge.arrow.width=0.3,
edge.color = 'azure4',
layout=layout_nicely(profgraph)
)
plot(supportgraph,
main='Support network betweenness',
vertex.color = my_palette[3],
vertex.frame.color = 'azure4',
vertex.size= 1+ betweenness_support * 0.02,
#vertex.size=5,
vertex.label.cex=0.5,
vertex.label = NA,
edge.width=0.1,
edge.arrow.size=0.1,
edge.arrow.width=0.3,
edge.color = 'azure4',
layout=layout_nicely(supportgraph)
)
Узлы с высоким значением betweenness встречаются в той же группе, что и обладающие властью – но это узлы другие, соединяющие разные части этой подгруппы (как мы видим, эта подгруппа не очень плотная и сама состоит из подрупп, пусть и не изолированных друг от друга, как три основных в сети). В целом выглядит все так, что в трех разных сетях разные мини-подгруппы соединяют примерно одни и те же работники.
Попробуем теперь построить визуализацию графа с учетом значений зависимой переменной, то есть желания покинуть организацию – это основная переменная, которую мы рассматриваем, поэтому интересно посмотреть распределение ее значений в сети. Поскольку intent_to_leave, как и остальные несетевые переменные, рассчитан у нас не для всех узлов, создадим новый вектор DV_vector, в котормо будут значения зависимой переменной для узлов, где она посчитана, а для тех, по которым данных нет, ее значение будет 0.
names<-ocb_att$Name # pull the names out of attributes dataset
DV_vector<-vector() #create a vector for gender
# Next, run a double-loop and assign gender to a corresponding node:
for(i in 1:122){ # this is our set of all network nodes
for(j in 1:68){ # this is our set of attribute-containing nodes
# for each node in i, we run through all node in j
# and compare names
if(V(friendgraph)$name[i]==names[j]){
#if we match, we add the attribute to a vector
DV_vector[i]<-intent_to_leave[j]
# and exit the inner loop for the next i
break;}
# if not, we are assigning a missing value
# and keep going until we find a matching node
else{DV_vector[i]<-0}
}
}
Насколько соотносится желание уйти с положением узла в сети (работника в серед коллег)? Конечно, дальше эта взаимосвязь будет проверена в линейной модели, но предварительно можно визуализировать отношения зависимой переменной и параметров центарльности. Построю графы трех сетей, в которых самые влиятельные узлы (по eigenvector, такими буду считать 25% узлов с самыми высокими значениями) будут выделены ярким цветом, а размер узла будет определяться значением зависимой переменной. Чтобы не смещаться в сторону неравномерности данных, узлы, по которым нет информации по зависимой переменной, окрашу белым цветом.
# Цвета по условиям
cols <- ifelse(eigenvector_friend > quantile(eigenvector_friend)[4], 'coral',
ifelse(DV_vector == 0, 'white', my_palette[1]))
# Визуализация
par(mar=c(1,1,1,1))
plot(friendgraph,
main='Intent to leave by eigenvector -- Friendship graph',
vertex.color = cols,
vertex.frame.color = 'azure4',
vertex.size= 1 + DV_vector,
#vertex.size=5,
vertex.label.cex=0.5,
vertex.label = NA,
edge.width=0.1,
edge.arrow.size=0.1,
edge.arrow.width=0.3,
edge.color = 'azure4',
layout=layout_nicely(friendgraph)
)
# Цвета по условиям
cols <- ifelse(eigenvector_prof > quantile(eigenvector_prof)[4], 'coral',
ifelse(DV_vector == 0, 'white', my_palette[2]))
# Визуализация
par(mar=c(1,1,1,1))
plot(profgraph,
main='Intent to leave by eigenvector -- Professinal graph',
vertex.color = cols,
vertex.frame.color = 'azure4',
vertex.size= 1 + DV_vector,
#vertex.size=5,
vertex.label.cex=0.5,
vertex.label = NA,
edge.width=0.1,
edge.arrow.size=0.1,
edge.arrow.width=0.3,
edge.color = 'azure4',
layout=layout_nicely(profgraph)
)
# Цвета по условиям
cols <- ifelse(eigenvector_support > quantile(eigenvector_support)[4], 'coral',
ifelse(DV_vector == 0, 'white', my_palette[1]))
# Визуализация
par(mar=c(1,1,1,1))
plot(supportgraph,
main='Intent to leave by eigenvector -- Support graph',
vertex.color = cols,
vertex.frame.color = 'azure4',
vertex.size= 1 + DV_vector,
#vertex.size=5,
vertex.label.cex=0.5,
vertex.label = NA,
edge.width=0.1,
edge.arrow.size=0.1,
edge.arrow.width=0.3,
edge.color = 'azure4',
layout=layout_nicely(supportgraph)
)
В целом, как видно из визуализаций, высокие показатели желания покинуть организацию свойственны как влиятельным узлам, так и не очень влиятельным (величина узла на графике визуально не коррелирует с принадлежностью в группе самых влиятельных узлов).
Может быть, иные резульаты покажет визуализация в разрезе betweenness?
# Цвета по условиям
cols <- ifelse(betweenness_friend > quantile(betweenness_friend)[4], 'coral',
ifelse(DV_vector == 0, 'white', my_palette[1]))
# Визуализация
par(mar=c(1,1,1,1))
plot(friendgraph,
main='Intent to leave by betweenness -- Friendship graph',
vertex.color = cols,
vertex.frame.color = 'azure4',
vertex.size= 1 + DV_vector,
#vertex.size=5,
vertex.label.cex=0.5,
vertex.label = NA,
edge.width=0.1,
edge.arrow.size=0.1,
edge.arrow.width=0.3,
edge.color = 'azure4',
layout=layout_nicely(friendgraph)
)
# Цвета по условиям
cols <- ifelse(betweenness_prof > quantile(betweenness_prof)[4], 'coral',
ifelse(DV_vector == 0, 'white', my_palette[2]))
# Визуализация
par(mar=c(1,1,1,1))
plot(profgraph,
main='Intent to leave by betweenness -- Professinal graph',
vertex.color = cols,
vertex.frame.color = 'azure4',
vertex.size= 1 + DV_vector,
#vertex.size=5,
vertex.label.cex=0.5,
vertex.label = NA,
edge.width=0.1,
edge.arrow.size=0.1,
edge.arrow.width=0.3,
edge.color = 'azure4',
layout=layout_nicely(profgraph)
)
# Цвета по условиям
cols <- ifelse(betweenness_support > quantile(betweenness_support)[4], 'coral',
ifelse(DV_vector == 0, 'white', my_palette[1]))
# Визуализация
par(mar=c(1,1,1,1))
plot(supportgraph,
main='Intent to leave by betweenness -- Support graph',
vertex.color = cols,
vertex.frame.color = 'azure4',
vertex.size= 1 + DV_vector,
#vertex.size=5,
vertex.label.cex=0.5,
vertex.label = NA,
edge.width=0.1,
edge.arrow.size=0.1,
edge.arrow.width=0.3,
edge.color = 'azure4',
layout=layout_nicely(supportgraph)
)
Для сравнения узлов по желанию покинуть организацию в разрезе центарльности betweenness ситуация аналогичная: желание уйти, похоже, слабо или вообще никак не связано с положением на геодезиках. Дальше это, опять же, будет проверено в линейной модели, но предварительно можно сказать, что сетевые переменные оказывают незначительное или никакое влияние на желание уйти (я не проверила здесь degree, оставляю на модель социального влияния, которая будет реализована в части 5 данной работы).
Задачу community detection я реализую посредством построения эксплораторной блокмодели для каждой из трех сетей с определением количества блоков, наилучшим образом отражающих структуру сетей.
Построю несколько блокмоделей для 3 >= k >= 10 последовательно для каждой из сетей. Минимальное количество блоков выбрано равным 3, поскольку меньшее число скорее невозможно в силу величины и сложности структуры сетей (наблюдаемых по крайней мере визуально), максимальное = 10 скорее для того, чтобы не заполнять слишком много пространства в итоговой версии проекта (до составления текста тестировалось и k, равное 20, на всякий случай).
Для построения блокмодели необходимо подготовить сети: сделать их симметричными для учета связей по типу “или-или” (Or Rule), а также создать объекты, отражающие dissimilarity structure (в виде матрицы расстояний между объектами; я использую здесь евклидово расстояние) и equivalence classes (по результатам иерархического кластерного анализа).
# Преобразовываю сеть в симметричную (OR rule)
friendnet_symm <- network(symmetrize(friendnet, rule='weak'), directed = FALSE)
# Dissimilarity structure
dist_friend <- dist(friendnet_symm, method="euclidian", diag=FALSE)
# Иерархический кластерный анализ для последующего блокмоделирования
clust_friend <- hclust(dist_friend, method="complete")
Затем для подбора оптимального количества блоков итеративно реализуем блокмодель с разными значениями k:
# Цикл для построения блокмодели с разным количеством блоков
for (i in (3:10)){
exploratory_ocd<-blockmodel(friendnet_symm, clust_friend, k=i,
block.content="density", mode="graph",
diag=FALSE)
cat('Число блоков:', i)
plot.blockmodel(exploratory_ocd)
}
## Число блоков: 3
## Число блоков: 4
## Число блоков: 5
## Число блоков: 6
## Число блоков: 7
## Число блоков: 8
## Число блоков: 9
## Число блоков: 10
Как видно из иллюстраций полученных блокмоделей, блоки реализуются по мере наращивания k неравномерно, чего, впрочем, следовало ожидать, поскольку в сети, например, очень много узлов без связей или находящихся на периферии подгрупп, что способствовало выделению их в отдельный (и самый наполненный блок). После 7-блочного решения начинают появляться блоки из одного узла, и выделяются они именно из маленьких блоков, поэтому я остановлюсь на 7-блочном решении.
Аналогичные действия проделываю с сетью профессиональных отношений.
# Преобразовываю сеть в симметричную (OR rule)
profnet_symm <- network(symmetrize(profnet, rule='weak'), directed = FALSE)
# Dissimilarity structure
dist_prof <- dist(profnet_symm, method="euclidian", diag=FALSE)
# Иерархический кластерный анализ для последующего блокмоделирования
clust_prof <- hclust(dist_prof, method="complete")
# Цикл для построения блокмодели с разным количеством блоков
for (i in (3:10)){
exploratory_ocd<-blockmodel(profnet_symm, clust_prof, k=i,
block.content="density", mode="graph",
diag=FALSE)
cat('Число блоков:', i)
plot.blockmodel(exploratory_ocd)
}
## Число блоков: 3
## Число блоков: 4
## Число блоков: 5
## Число блоков: 6
## Число блоков: 7
## Число блоков: 8
## Число блоков: 9
## Число блоков: 10
При k=7 выделяется первый блок из одного узла, но как мы видим на визуализации по его связям с другими узлами, это выделение скорее обосновано, т.к. выделившийся узел имеет уникальный характер связи с другими узлами по сравнению с узлами соседних блоков.
Наконец, сеть отношений поддержки – проделываю аналогичные действия по подбору оптимального k для блокмодели.
# Преобразовываю сеть в симметричную (OR rule)
supportnet_symm <- network(symmetrize(supportnet, rule='weak'), directed = FALSE)
# Dissimilarity structure
dist_support <- dist(supportnet_symm, method="euclidian", diag=FALSE)
# Иерархический кластерный анализ для последующего блокмоделирования
clust_support <- hclust(dist_support, method="complete")
# Цикл для построения блокмодели с разным количеством блоков
for (i in (3:10)){
exploratory_ocd<-blockmodel(supportnet_symm, clust_support, k=i,
block.content="density", mode="graph",
diag=FALSE)
cat('Число блоков:', i)
plot.blockmodel(exploratory_ocd)
}
## Число блоков: 3
## Число блоков: 4
## Число блоков: 5
## Число блоков: 6
## Число блоков: 7
## Число блоков: 8
## Число блоков: 9
## Число блоков: 10
В данном случае, как мы видим, при наращивании k блоки выделяются принципиально отличным от предущих моделей образом: сначала выделяются маленькие блоки, состояющие из одного или нескольких узлов, а затем - блоки побольше, выделяющиеся из самого большого по наполенности блока. В этом случае я останавливаю выбор на 9-блочной модели, после которой вслед за “большими” блоками снова начинают выделяться одиночные.
По всей видимости, несмотря на схожую на первый взляд структуру всех трех сетей, можно сказать, что структура сети поддержки отличается от двух других сетей. Дальше я посмотрю на визуализации и попробую пояснить такое различие.
В данном разделе будут построены и визуализированы на графах итоговые блокмодели. Для сетей дружбы и профессиональных отношений я выбрала 7-блочные решения, для сети поодержки - 9-блочные.
detach(package:igraph)
# Названия узлов для отображения их на визуализациях графов
names_blocks <- get.vertex.attribute(friendnet, "vertex.names")
library(igraph)
Построение финальных блокмоделей и визуализация сетей с присваиванием разных цветов блокам – ниже.
# Финальная блокмодель с выбранным количеством блоков
exploratory_friend<-blockmodel(friendnet_symm, clust_friend, k=7,
block.content="density", mode="graph",
diag=FALSE, plabels = names_blocks)
# Визуализация: присваиваю каждому блоку свой цвет
cols <- ifelse(exploratory_friend[[1]] == 1, my_palette[1],
ifelse(exploratory_friend[[1]] == 2, my_palette[2],
ifelse(exploratory_friend[[1]] == 3, my_palette[3],
ifelse(exploratory_friend[[1]] == 4, my_palette[4],
ifelse(exploratory_friend[[1]] == 5, my_palette[5],
ifelse(exploratory_friend[[1]] == 6, my_palette[6],
my_palette[7]))))))
# Для визуализации достаю граф из блокмодели
# (по сути тот же граф, что и использованный ранее, но в других assignments я заметила, что порядок узлов при блокмоделировании меняется, и цвета присваиваются неверно)
viz_graph <- graph.adjacency(exploratory_friend[[4]],mode=c("undirected"),weighted=NULL,diag=FALSE)
# Собственно визуализация блоков
par(mar=c(1,1,2,1),mfrow=c(1,1))
plot(viz_graph,
main='Friendship network blocks',
vertex.color = cols,
vertex.frame.color = 'azure4',
vertex.size=5,
vertex.label.cex=0.5,
#vertex.label = NA,
edge.width=0.1,
edge.arrow.size=0.3,
edge.arrow.width=0.9,
edge.color = 'azure4',
layout=layout_nicely(viz_graph)
)
# Финальная блокмодель с выбранным количеством блоков
exploratory_prof<-blockmodel(profnet_symm, clust_friend, k=6,
block.content="density", mode="graph",
diag=FALSE, plabels = names_blocks)
# Визуализация: присваиваю каждому блоку свой цвет
cols <- ifelse(exploratory_prof[[1]] == 1, my_palette[1],
ifelse(exploratory_prof[[1]] == 2, my_palette[2],
ifelse(exploratory_prof[[1]] == 3, my_palette[3],
ifelse(exploratory_prof[[1]] == 4, my_palette[4],
ifelse(exploratory_prof[[1]] == 5, my_palette[5],
my_palette[6])))))
# Для визуализации достаю граф из блокмодели
viz_graph <- graph.adjacency(exploratory_prof[[4]],mode=c("undirected"),weighted=NULL,diag=FALSE)
# Собственно визуализация блоков
par(mar=c(1,1,2,1),mfrow=c(1,1))
plot(viz_graph,
main='Professional network blocks',
vertex.color = cols,
vertex.frame.color = 'azure4',
vertex.size=5,
vertex.label.cex=0.5,
#vertex.label = NA,
edge.width=0.1,
edge.arrow.size=0.3,
edge.arrow.width=0.9,
edge.color = 'azure4',
layout=layout_nicely(viz_graph)
)
# Финальная блокмодель с выбранным количеством блоков
exploratory_support<-blockmodel(supportnet_symm, clust_friend, k=9,
block.content="density", mode="graph",
diag=FALSE, plabels =names_blocks)
# Визуализация: присваиваю каждому блоку свой цвет
cols <- ifelse(exploratory_support[[1]] == 1, my_palette[1],
ifelse(exploratory_support[[1]] == 2, my_palette[2],
ifelse(exploratory_support[[1]] == 3, my_palette[3],
ifelse(exploratory_support[[1]] == 4, my_palette[4],
ifelse(exploratory_support[[1]] == 5, my_palette[5],
ifelse(exploratory_support[[1]] == 6, my_palette[6],
ifelse(exploratory_support[[1]] == 7, my_palette[7],
ifelse(exploratory_support[[1]] == 8, my_palette[8],
my_palette[9]))))))))
# Для визуализации достаю граф из блокмодели
viz_graph <- graph.adjacency(exploratory_support[[4]],mode=c("undirected"),weighted=NULL,diag=FALSE)
# Собственно визуализация блоков
par(mar=c(1,1,2,1),mfrow=c(1,1))
plot(viz_graph,
main='Support network blocks',
vertex.color = cols,
vertex.frame.color = 'azure4',
vertex.size=5,
vertex.label.cex=0.5,
#vertex.label = NA,
edge.width=0.1,
edge.arrow.size=0.3,
edge.arrow.width=0.9,
edge.color = 'azure4',
layout=layout_nicely(viz_graph)
)
Как мы видим из визуализации, блоки в первых двух сетях образованы практически идентичными узлами. Это значит, что структуры профессиональных и дружеских отношений в общем виде очень схожи. Возможно, это объясняется возникновением дружеских отношений на базе профессиональных, которые являются априорными в организации.
В целом, во введении описаны все предпосылки модели социального влияния, см. раздел Theoretical foundation. Зависимая переменная, напоминаю, намерение покинуть компанию.
Поскольку в модель будут включаться как сетевые, так и индивидуальные характеристики сотрудников, стоит соотнести их друг с другом. У нас есть атрибуты для 68 сотрудников, в то время как в сетях их представлено 122. Создам векторы для сетевых характеристик акторов, представленных в данных с атрибутами.
friend_indegree <- vector()
friend_outdegree <- vector()
friend_total_degree <- vector()
support_indegree <- vector()
support_outdegree <- vector()
support_total_degree <- vector()
prof_indegree <- vector()
prof_outdegree <- vector()
prof_total_degree <- vector()
prof_betweenness <- vector()
prof_eigenvector <- vector()
support_betweenness <- vector()
support_eigenvector <- vector()
friend_betweenness <- vector()
friend_eigenvector <- vector()
names<-ocb_att$Name # pull the names out of attributes dataset
for(i in 1:122){
for(j in 1:68){
if(V(friendgraph)$name[i]==names[j]){
friend_indegree[j] <- indegree_friend[i]
friend_outdegree[j] <- outdegree_friend[i]
friend_total_degree[j] <- total_degree_friend[i]
support_indegree[j] <- indegree_support[i]
support_outdegree[j] <- outdegree_support[i]
support_total_degree[j] <- total_degree_support[i]
prof_indegree[j] <- indegree_prof[i]
prof_outdegree[j] <- outdegree_prof[i]
prof_total_degree[j] <-total_degree_prof[i]
prof_betweenness[j] <- betweenness_prof[i]
prof_eigenvector[j] <- eigenvector_prof[i]
support_betweenness[j] <- betweenness_support[i]
support_eigenvector[j] <- eigenvector_support[i]
friend_betweenness[j] <- betweenness_friend[i]
friend_eigenvector[j] <- eigenvector_friend[i]
break;}
else{}
}
}
Итак, для линейной модели, где зависимая переменная - намерение уйти, я имею несколько переменных-атрибутов и переменных-центральностей как характеристик социальной сети оранизации. Далее все эти переменные можно включить в модель.
Для начала построю корреляционную матрицу для всех незаввисимых переменных. Включу туда также зависимую переменную, чтобы заранее оценить ее “связь” с независимыми переменными.
var_mat<-cbind(intent_to_leave,
age, sex, emot_part, phys_part, role_confl, admin_probl,
work_quant, work_resp, work_diff, work_speed,
friend_indegree, friend_outdegree, friend_total_degree,
support_indegree, support_outdegree, support_total_degree,
prof_indegree, prof_outdegree, prof_total_degree,
prof_betweenness, prof_eigenvector,
support_betweenness, support_eigenvector,
friend_betweenness, friend_eigenvector
)
cor_mat<-cor(var_mat)
row.names(cor_mat) <- c('Intent to leave', '1.Age', '2.Gender', '3.Emotional participation', '4.Physical participation', '5.Role conflict', '6.Administrative problems', '7.Work Quantity', '8. Work Responsibilities', '9. Work Difficulty', '10. Work Speed', '11.Friend network indegree','12.Friend network outdegree', '13.Friend network total degree','14.Support network indegree', '15.Support network outdegree','16.Support network total degree', '17.Prof network indegree','18.Prof network outdegree', '19.Prof network total degree', '20.Prof network betweenness','21.Prof network eigenvalue', '22.Support network betweenness','23.Support network eigenvalue', '24.Friend network betweenness','25.Friend network eigenvalue')
kable(cor_mat, digits=2,
col.names=c("Intent to leave",
"1","2","3","4","5","6","7","8","9","10","11","12",
"13","14","15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25"),
row.names=TRUE, caption="Correlations of HR Influence Model Variables") %>%
kable_styling(latex_options=c("scale_down", "hold_position"))
| Intent to leave | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Intent to leave | 1.00 | -0.04 | 0.06 | -0.52 | -0.42 | 0.19 | 0.16 | -0.30 | -0.49 | -0.38 | -0.51 | -0.12 | -0.14 | -0.16 | -0.15 | -0.20 | -0.21 | -0.18 | -0.16 | -0.20 | -0.15 | -0.02 | -0.17 | -0.06 | -0.16 | -0.04 |
| 1.Age | -0.04 | 1.00 | -0.02 | -0.03 | 0.06 | -0.12 | -0.22 | 0.26 | 0.32 | 0.11 | 0.22 | 0.58 | 0.35 | 0.57 | 0.54 | 0.31 | 0.50 | 0.56 | 0.35 | 0.54 | 0.36 | 0.64 | 0.39 | 0.62 | 0.32 | 0.64 |
| 2.Gender | 0.06 | -0.02 | 1.00 | -0.13 | -0.06 | 0.28 | 0.16 | 0.11 | 0.10 | -0.20 | -0.01 | 0.21 | 0.10 | 0.18 | 0.11 | 0.10 | 0.12 | 0.20 | 0.16 | 0.22 | 0.25 | 0.23 | 0.22 | 0.30 | 0.17 | 0.26 |
| 3.Emotional participation | -0.52 | -0.03 | -0.13 | 1.00 | 0.74 | -0.39 | -0.34 | 0.39 | 0.46 | 0.52 | 0.44 | 0.13 | 0.27 | 0.25 | 0.23 | 0.32 | 0.34 | 0.15 | 0.24 | 0.23 | 0.20 | -0.07 | 0.25 | -0.01 | 0.24 | -0.03 |
| 4.Physical participation | -0.42 | 0.06 | -0.06 | 0.74 | 1.00 | -0.21 | -0.23 | 0.46 | 0.37 | 0.49 | 0.46 | 0.24 | 0.29 | 0.33 | 0.22 | 0.27 | 0.30 | 0.20 | 0.18 | 0.23 | 0.18 | 0.13 | 0.21 | 0.12 | 0.27 | 0.15 |
| 5.Role conflict | 0.19 | -0.12 | 0.28 | -0.39 | -0.21 | 1.00 | 0.33 | 0.24 | -0.17 | -0.15 | -0.01 | -0.04 | -0.10 | -0.09 | -0.10 | -0.05 | -0.09 | 0.00 | -0.01 | -0.01 | -0.04 | -0.09 | -0.11 | -0.11 | -0.10 | -0.09 |
| 6.Administrative problems | 0.16 | -0.22 | 0.16 | -0.34 | -0.23 | 0.33 | 1.00 | -0.02 | -0.35 | -0.29 | -0.13 | -0.17 | -0.06 | -0.14 | -0.21 | -0.06 | -0.16 | -0.17 | -0.19 | -0.21 | -0.13 | -0.22 | -0.13 | -0.24 | -0.11 | -0.20 |
| 7.Work Quantity | -0.30 | 0.26 | 0.11 | 0.39 | 0.46 | 0.24 | -0.02 | 1.00 | 0.35 | 0.36 | 0.52 | 0.27 | 0.20 | 0.29 | 0.31 | 0.26 | 0.34 | 0.35 | 0.23 | 0.35 | 0.13 | 0.22 | 0.17 | 0.22 | 0.17 | 0.24 |
|
-0.49 | 0.32 | 0.10 | 0.46 | 0.37 | -0.17 | -0.35 | 0.35 | 1.00 | 0.39 | 0.41 | 0.34 | 0.24 | 0.36 | 0.38 | 0.21 | 0.34 | 0.38 | 0.27 | 0.39 | 0.38 | 0.25 | 0.35 | 0.30 | 0.34 | 0.27 |
|
-0.38 | 0.11 | -0.20 | 0.52 | 0.49 | -0.15 | -0.29 | 0.36 | 0.39 | 1.00 | 0.63 | 0.07 | -0.04 | 0.02 | 0.10 | 0.07 | 0.10 | 0.05 | 0.05 | 0.06 | 0.08 | -0.06 | 0.09 | -0.09 | 0.11 | -0.10 |
|
-0.51 | 0.22 | -0.01 | 0.44 | 0.46 | -0.01 | -0.13 | 0.52 | 0.41 | 0.63 | 1.00 | 0.11 | 0.14 | 0.16 | 0.17 | 0.21 | 0.23 | 0.16 | 0.26 | 0.25 | 0.16 | 0.06 | 0.20 | 0.07 | 0.16 | 0.07 |
| 11.Friend network indegree | -0.12 | 0.58 | 0.21 | 0.13 | 0.24 | -0.04 | -0.17 | 0.27 | 0.34 | 0.07 | 0.11 | 1.00 | 0.33 | 0.79 | 0.85 | 0.32 | 0.67 | 0.90 | 0.34 | 0.74 | 0.58 | 0.68 | 0.55 | 0.73 | 0.56 | 0.72 |
| 12.Friend network outdegree | -0.14 | 0.35 | 0.10 | 0.27 | 0.29 | -0.10 | -0.06 | 0.20 | 0.24 | -0.04 | 0.14 | 0.33 | 1.00 | 0.83 | 0.42 | 0.72 | 0.70 | 0.44 | 0.79 | 0.73 | 0.51 | 0.44 | 0.46 | 0.46 | 0.52 | 0.52 |
| 13.Friend network total degree | -0.16 | 0.57 | 0.18 | 0.25 | 0.33 | -0.09 | -0.14 | 0.29 | 0.36 | 0.02 | 0.16 | 0.79 | 0.83 | 1.00 | 0.77 | 0.65 | 0.84 | 0.81 | 0.70 | 0.90 | 0.66 | 0.68 | 0.62 | 0.72 | 0.66 | 0.75 |
| 14.Support network indegree | -0.15 | 0.54 | 0.11 | 0.23 | 0.22 | -0.10 | -0.21 | 0.31 | 0.38 | 0.10 | 0.17 | 0.85 | 0.42 | 0.77 | 1.00 | 0.38 | 0.80 | 0.90 | 0.36 | 0.76 | 0.56 | 0.54 | 0.61 | 0.62 | 0.52 | 0.58 |
| 15.Support network outdegree | -0.20 | 0.31 | 0.10 | 0.32 | 0.27 | -0.05 | -0.06 | 0.26 | 0.21 | 0.07 | 0.21 | 0.32 | 0.72 | 0.65 | 0.38 | 1.00 | 0.86 | 0.39 | 0.66 | 0.62 | 0.46 | 0.31 | 0.53 | 0.43 | 0.40 | 0.32 |
| 16.Support network total degree | -0.21 | 0.50 | 0.12 | 0.34 | 0.30 | -0.09 | -0.16 | 0.34 | 0.34 | 0.10 | 0.23 | 0.67 | 0.70 | 0.84 | 0.80 | 0.86 | 1.00 | 0.75 | 0.63 | 0.82 | 0.60 | 0.50 | 0.68 | 0.62 | 0.54 | 0.53 |
| 17.Prof network indegree | -0.18 | 0.56 | 0.20 | 0.15 | 0.20 | 0.00 | -0.17 | 0.35 | 0.38 | 0.05 | 0.16 | 0.90 | 0.44 | 0.81 | 0.90 | 0.39 | 0.75 | 1.00 | 0.40 | 0.84 | 0.57 | 0.68 | 0.55 | 0.73 | 0.50 | 0.71 |
| 18.Prof network outdegree | -0.16 | 0.35 | 0.16 | 0.24 | 0.18 | -0.01 | -0.19 | 0.23 | 0.27 | 0.05 | 0.26 | 0.34 | 0.79 | 0.70 | 0.36 | 0.66 | 0.63 | 0.40 | 1.00 | 0.84 | 0.45 | 0.42 | 0.35 | 0.42 | 0.37 | 0.43 |
| 19.Prof network total degree | -0.20 | 0.54 | 0.22 | 0.23 | 0.23 | -0.01 | -0.21 | 0.35 | 0.39 | 0.06 | 0.25 | 0.74 | 0.73 | 0.90 | 0.76 | 0.62 | 0.82 | 0.84 | 0.84 | 1.00 | 0.61 | 0.66 | 0.54 | 0.69 | 0.52 | 0.68 |
| 20.Prof network betweenness | -0.15 | 0.36 | 0.25 | 0.20 | 0.18 | -0.04 | -0.13 | 0.13 | 0.38 | 0.08 | 0.16 | 0.58 | 0.51 | 0.66 | 0.56 | 0.46 | 0.60 | 0.57 | 0.45 | 0.61 | 1.00 | 0.34 | 0.89 | 0.44 | 0.92 | 0.41 |
| 21.Prof network eigenvalue | -0.02 | 0.64 | 0.23 | -0.07 | 0.13 | -0.09 | -0.22 | 0.22 | 0.25 | -0.06 | 0.06 | 0.68 | 0.44 | 0.68 | 0.54 | 0.31 | 0.50 | 0.68 | 0.42 | 0.66 | 0.34 | 1.00 | 0.27 | 0.94 | 0.30 | 0.97 |
| 22.Support network betweenness | -0.17 | 0.39 | 0.22 | 0.25 | 0.21 | -0.11 | -0.13 | 0.17 | 0.35 | 0.09 | 0.20 | 0.55 | 0.46 | 0.62 | 0.61 | 0.53 | 0.68 | 0.55 | 0.35 | 0.54 | 0.89 | 0.27 | 1.00 | 0.43 | 0.89 | 0.36 |
| 23.Support network eigenvalue | -0.06 | 0.62 | 0.30 | -0.01 | 0.12 | -0.11 | -0.24 | 0.22 | 0.30 | -0.09 | 0.07 | 0.73 | 0.46 | 0.72 | 0.62 | 0.43 | 0.62 | 0.73 | 0.42 | 0.69 | 0.44 | 0.94 | 0.43 | 1.00 | 0.39 | 0.95 |
| 24.Friend network betweenness | -0.16 | 0.32 | 0.17 | 0.24 | 0.27 | -0.10 | -0.11 | 0.17 | 0.34 | 0.11 | 0.16 | 0.56 | 0.52 | 0.66 | 0.52 | 0.40 | 0.54 | 0.50 | 0.37 | 0.52 | 0.92 | 0.30 | 0.89 | 0.39 | 1.00 | 0.41 |
| 25.Friend network eigenvalue | -0.04 | 0.64 | 0.26 | -0.03 | 0.15 | -0.09 | -0.20 | 0.24 | 0.27 | -0.10 | 0.07 | 0.72 | 0.52 | 0.75 | 0.58 | 0.32 | 0.53 | 0.71 | 0.43 | 0.68 | 0.41 | 0.97 | 0.36 | 0.95 | 0.41 | 1.00 |
Как видно из корреляционной матрицы, целевая переменная имеет высокую степень взаимной изменчивости с некоторыми из независимых переменных, причем это справедливо скорее для переменных-атрибутов акторов, чем для переменных - мер центральности сетей.
Построю первую модель. Независимых переменных очень много, но ожидаю, что большая их часть итеративно уйдет в процессе удаления переменных с незначимыми регрессионными коэффициентами.
my_model <- lm(intent_to_leave ~
age
+ sex
+ work_quant
+ work_resp
+ work_diff
+ work_speed
+ emot_part
+ phys_part
+ role_confl
+ admin_probl
+ friend_indegree
+ friend_outdegree
+ friend_total_degree
+ support_indegree
+ support_outdegree
+ support_total_degree
+ prof_indegree
+ prof_outdegree
+ prof_total_degree
+ prof_betweenness
+ prof_eigenvector
+ friend_betweenness
+ friend_eigenvector
+ support_betweenness
+ support_eigenvector
)
summary(my_model)
##
## Call:
## lm(formula = intent_to_leave ~ age + sex + work_quant + work_resp +
## work_diff + work_speed + emot_part + phys_part + role_confl +
## admin_probl + friend_indegree + friend_outdegree + friend_total_degree +
## support_indegree + support_outdegree + support_total_degree +
## prof_indegree + prof_outdegree + prof_total_degree + prof_betweenness +
## prof_eigenvector + friend_betweenness + friend_eigenvector +
## support_betweenness + support_eigenvector)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1.7574 -0.8782 0.0538 0.7267 3.4248
##
## Coefficients: (3 not defined because of singularities)
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 5.822324 2.009994 2.897 0.0058 **
## age 0.020425 0.043735 0.467 0.6427
## sex 0.248632 0.459261 0.541 0.5909
## work_quant 0.124407 0.222491 0.559 0.5788
## work_resp -0.223287 0.103134 -2.165 0.0357 *
## work_diff 0.090586 0.210255 0.431 0.6686
## work_speed -0.366876 0.199501 -1.839 0.0725 .
## emot_part -0.318037 0.312216 -1.019 0.3138
## phys_part -0.071055 0.291808 -0.243 0.8087
## role_confl 0.094439 0.170580 0.554 0.5826
## admin_probl -0.076787 0.136184 -0.564 0.5757
## friend_indegree 0.162378 0.231995 0.700 0.4876
## friend_outdegree 0.188882 0.222591 0.849 0.4006
## friend_total_degree NA NA NA NA
## support_indegree 0.165379 0.196338 0.842 0.4041
## support_outdegree -0.126027 0.158154 -0.797 0.4297
## support_total_degree NA NA NA NA
## prof_indegree -0.299082 0.198011 -1.510 0.1379
## prof_outdegree -0.049545 0.125898 -0.394 0.6958
## prof_total_degree NA NA NA NA
## prof_betweenness 0.001656 0.004125 0.402 0.6899
## prof_eigenvector 2.485733 4.195834 0.592 0.5565
## friend_betweenness -0.002363 0.005684 -0.416 0.6796
## friend_eigenvector -3.431140 6.053728 -0.567 0.5737
## support_betweenness 0.001183 0.005204 0.227 0.8213
## support_eigenvector 0.799034 3.975486 0.201 0.8416
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 1.303 on 45 degrees of freedom
## Multiple R-squared: 0.471, Adjusted R-squared: 0.2123
## F-statistic: 1.821 on 22 and 45 DF, p-value: 0.04419
Как я ожидала, большая часть переменных имеет статистически не значимый регрессионный коэффициент, поэтому они будут итеративно исключены из модели в порядке убывания p-value при каждой итерации. Стоит заметить, что для центральности total degree коэффициенты не были рассчитаны, и, как я понимаю, это связано с тем, что они линейно связаны с другими независимыми переменными (indegree и outdegree для соответствующих сетей). В процессе удаления связанных переменных с незначимыми коэффициентами для данных переменных коэффициенты и статистики уже считались.
Итоговая модель вот такая:
my_model <- lm(intent_to_leave ~
+ work_resp
+ work_speed
+ emot_part
)
summary(my_model)
##
## Call:
## lm(formula = intent_to_leave ~ +work_resp + work_speed + emot_part)
##
## Residuals:
## Min 1Q Median 3Q Max
## -2.4348 -0.9383 -0.1042 0.7216 3.2172
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 6.94533 0.75924 9.148 3.13e-13 ***
## work_resp -0.16521 0.07714 -2.142 0.0360 *
## work_speed -0.31100 0.12229 -2.543 0.0134 *
## emot_part -0.36475 0.14375 -2.537 0.0136 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 1.154 on 64 degrees of freedom
## Multiple R-squared: 0.4099, Adjusted R-squared: 0.3823
## F-statistic: 14.82 on 3 and 64 DF, p-value: 1.969e-07
Статистики полученной линейной модели показывают, что вариация зависимой переменной – намерения уйти – примерно на 40% объясняется переменными Work Responsibility, Work Speed и Emotional Participation. Статистически этот результат хорош, однако можно заметить, что в итоговую модель не вошли выбранные мной изначально сетевые переменные, поскольку они не были способны статистически значимо объяснить изменение зависимой переменной.
С точки зрения интерпретации: интересно, что ответственность на рабочем месте и скорость работы имеют отрицательные регрессионные коэффициенты. Это значит, что чем выше работник оценивает отвтетственость своей работы и необходимую для работы скорость, тем ниже у него будет намерение уйти с работы. В целом, это соответствует концепту challenge stressors, индикаторами которого являются эти переменные – факторы “давления” (pressure), которые несмотря на способствование напряжению (и возможно будущему выгоранию), стимулируют творческий потенциал и желание развиваться. Поэтому дополнительный челлендж на работе может как раз снижать желание покинуть организацию.
С эмоциональным участием, которое я связывала изначально с удовлетворенностью работой, все еще более очевидно: повышение эмоциональной вовлеченности в работу связано со снижением зависимой переменной - намерения уйти из организации.
Вспоминаю свои изначальные гипотезы и делаю по ним краткие выводы на основе модели социального влияния:
Удовлетворенность работой и приверженность организации будут снижать намерение покинуть организацию. Так как эмоциональная вовлеченность была индикатором удовлетворенности работой, можно считать, что содеражтельно гипотеза подтвердилась.
Более высокое восприятие осмысленности работы будет снижать намерение покинуть организацию. По поводу этой гипотезы нельзя ничего сказать, так как соот-щие переменные имели незначимые коэффициенты, т.е. они не связаны с целевой переменной. Возможно, стоит подобрать иные индикаторы для осмысленности работы.
Факторы стресса скорее будут повышать намерение покинуть организацию. Это оказалось не так, однако я изначально предполагала стимулирующий потенциал факторов стресса.
Положение работника в сетевых отношениях будет связано с намерением уйти. Увы, оказалось, что сетевые переменные не имели никакого эффекта на независимую переменную. Вероятно, имеет смысл рассмотреть другие centralities, а также взять еще и сеть вертикальных отношений (Boss Net).
Гендер ии возраст не будут связаны с намерением уйти. Это оказалось так - регрессионные коэффициенты при переменных были незначимы.
В целом, хотя сетевые переменные оказались не объясняющими зависимую переменную, они дали мне довольно широкий пласт информации о данных, с которыми я работала: от общей структуры сети до распределения влияния и выделения блоков по эквивалентному положению в структуре организации.
Cho S., Johanson M. M., Guchait P. Employees intent to leave: A comparison of determinants of intent to leave versus intent to stay //International journal of hospitality management. – 2009. – Т. 28. – №. 3. – С. 374-381.
Chung Y., Choo H. A structural path to job satisfaction, burnout, and intent to leave among child protection workers: A South Korean study //Children and Youth Services Review. – 2019. – Т. 100. – С. 304-312.
Emory J. et al. Commitment, job satisfaction and personality: A cross sectional study of generational cohorts in nursing students //Journal of Professional Nursing. – 2022. – Т. 40. – С. 42-47.
Estryn-Béhar M. et al. The impact of social work environment, teamwork characteristics, burnout, and personal factors upon intent to leave among European nurses //Medical care. – 2007. – С. 939-950.
Hellman C. M. Job satisfaction and intent to leave //The journal of social psychology. – 1997. – Т. 137. – №. 6. – С. 677-689.
Martin N. K., Sass D. A., Schmitt T. A. Teacher efficacy in student engagement, instructional management, student stressors, and burnout: A theoretical model using in-class variables to predict teachers’ intent-to-leave //Teaching and Teacher Education. – 2012. – Т. 28. – №. 4. – С. 546-559.
Nowrouzi-Kia B., Fox M. T. Factors associated with intent to leave in registered nurses working in acute care hospitals: a cross-sectional study in Ontario, Canada //Workplace health & safety. – 2020. – Т. 68. – №. 3. – С. 121-128.
Oprea B., Păduraru L., Iliescu D. Job crafting and intent to leave: the mediating role of meaningful work and engagement //Journal of Career Development. – 2020. –.
Singh D. et al. Factors Determining Employees Intent to Leave an Organization: A View from Private Education Industry with Special Reference to Professional Institutions in Patiala. – 2014.
Гребер Д. Бредовая работа: Трактат о распространении бессмысленного труда. – Ad Marginem, 2020.